#include <iostream>
#include <iomanip>

using namespace std;

class Date {
public:
  int year;
  int month;
  int day;

  Date(int y, int m, int d): year(y), month(m), day(d) {
    if (m == 1 && d >= 32) {
      // 例如：当输入的 d 不正确的时候，默认给它设置成一个正确的值
      d = 31;
    }
  }
};

int main(int argc, char const *argv[])
{
  /* code */
  // 计算机的内存说起
  // 1.最小的存储单位：字节
  // 2.8GB = 8 * 1024 MB = 8 * 1024 * 1024 KB = 8 * 1024 * 1024 * 1024 Byte
  // vector<char> memory
  // 管这些用于唯一指定字节位置的编号，叫做地址
  // 0 = 内存的第 0 个字节
  // 1 = 内存的第 1 个字节
  // ...
  // 8589934591
  // 自定义类型的指针
  Date today {2022, 7, 20};
  cout << today.year << endl; // 访问 today 的 year 属性

  Date *p_date = &today;
  cout << p_date->year << endl;

  

  int n = 100; // n 在内存的什么地方呢？
  cout << &n << endl; // 读取 n 在内存中的位置，& - 取地址操作符

  int m = 103;
  cout << &m << endl;

  char c1 = 'A';
  char c2 = 'B';
  cout << "-------------------" << endl;
  cout << (void*)&c1 << endl << (void*)&c2 << endl;

  // 地址：变量在内存大数组里的编号，位置， 索引
  // 取地址操作符：&
  // 用什么类型的变量来保存 &n 的值：指针变量
  int * address = &n;

  cout << &n << endl;
  cout << address << endl;

  // 指针变量怎么用： 间接操作它指向的内容
  cout << "n = " << n << endl;
  ++n; // 直接操作变量
  ++(*address); // 间接修改它指向的变量，* 指针的取内容操作符
  cout << "n = " << n << endl;


  return 0;
}
